#define ETHERTYPE_IPV4                      16w0x800
#define IP_PROTOCOLS_TCP                    8w6

parser ParserImpl(packet_in pkt_in, out Parsed_packet pp,
    inout custom_metadata_t meta,
    inout standard_metadata_t standard_metadata) {
//state关键字用于创建一个新的解析状态
    state start {  //解析器初始状态
        pkt_in.extract(pp.ethernet);  //从输入数据包中提取以太网帧头部，并将其存储在 pp.ethernet 中
        transition select(pp.ethernet.etherType) {  //根据以太网类型进行状态转换，类型信息存储在 pp.ethernet.etherType 中
            ETHERTYPE_IPV4: parse_ipv4;  //如果以太网类型是 IPv4，则转换到 parse_ipv4 状态
            // no default rule: all other packets rejected  //如果以太网类型不是 IPv4，则数据包被拒绝
        }
    }

    state parse_ipv4 {//解析器从输入数据包中提取IPv4头部，并根据协议类型进行状态转换
        pkt_in.extract(pp.ipv4);
        transition select(pp.ipv4.protocol) {
            IP_PROTOCOLS_TCP: parse_tcp;
            default: accept;
        }//如果协议类型是TCP，则转换到 parse_tcp 状态；默认接受该数据包即使不是tcp数据包。
    }

    state parse_tcp { //从输入数据包中提取TCP头部，并接受该数据包
        pkt_in.extract(pp.tcp);

        transition accept;  //一个状态转换规则，表示当解析器处于某个特定状态时，如果满足特定条件（在这个例子中是提取了TCP头部），则解析器将接受当前的数据包并结束解析过程
    }
}//构建了一个解析器状态机
